{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应 `tf.keras` 的01~02章节"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=9, micro=7, releaselevel='final', serial=0)\n",
      "matplotlib 3.5.0\n",
      "numpy 1.21.4\n",
      "pandas 1.3.4\n",
      "sklearn 1.1.2\n",
      "torch 2.1.0+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "\n",
    "# fashion_mnist图像分类数据集\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([1, 28, 28]), 9)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过id取数据，取到的是一个元祖\n",
    "img, label = train_ds[0]\n",
    "img.shape, label\n",
    "# img.shape = (1, 28, 28)，这是因为通道数在最前面"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x345.6 with 15 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col \n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label])\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot']\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(28 * 28, 300),  # in_features=784, out_features=300\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(300, 100),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(100, 10),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 28 * 28]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看网络结构\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "source": [
    "for name, param in model.named_parameters():\n",
    "      print(name, param.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[-0.0098, -0.0327, -0.0249,  ...,  0.0129,  0.0318, -0.0025],\n",
       "         [ 0.0320, -0.0011, -0.0325,  ..., -0.0106, -0.0263, -0.0016],\n",
       "         [ 0.0112,  0.0132,  0.0124,  ..., -0.0158, -0.0318,  0.0193],\n",
       "         ...,\n",
       "         [-0.0029,  0.0002, -0.0133,  ..., -0.0207,  0.0053, -0.0298],\n",
       "         [-0.0272, -0.0196, -0.0219,  ...,  0.0105, -0.0049,  0.0219],\n",
       "         [ 0.0199,  0.0160, -0.0129,  ..., -0.0167, -0.0356,  0.0110]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-6.1924e-02,  4.7219e-02, -1.2199e-02,  1.9332e-02, -6.9656e-02,\n",
       "          1.2636e-01, -1.1748e-03,  7.3128e-02,  1.3139e-02, -3.8046e-03,\n",
       "          7.9963e-02,  4.9807e-02,  1.1632e-01,  4.4749e-02, -4.1856e-02,\n",
       "          5.2835e-02,  2.7400e-02,  5.5610e-02,  3.6627e-02,  6.0678e-02,\n",
       "          1.9123e-02,  9.5829e-03,  9.5849e-02,  9.2094e-02, -2.1722e-02,\n",
       "          3.2610e-03,  1.6744e-02,  1.2911e-01, -8.8393e-03,  3.3600e-02,\n",
       "          7.7012e-02,  5.5132e-02, -4.4095e-02,  1.9817e-02, -5.3184e-03,\n",
       "         -1.2636e-02,  1.2599e-01, -6.4185e-02,  1.0129e-01,  8.9009e-03,\n",
       "          1.6350e-01,  2.6881e-02,  8.8204e-02, -5.9680e-02,  9.9345e-02,\n",
       "          8.5805e-02,  1.8854e-02, -1.1697e-02, -2.5410e-02,  9.3409e-02,\n",
       "          7.0586e-02,  3.6597e-02, -2.4283e-03, -1.5532e-02,  2.1564e-02,\n",
       "         -2.0132e-02, -1.3632e-01,  1.2706e-04,  1.0302e-02,  5.4290e-02,\n",
       "          1.1809e-01, -1.1090e-01,  6.4115e-02,  1.1897e-01, -3.3895e-02,\n",
       "         -1.9673e-02,  4.9872e-02,  4.6665e-03,  1.5825e-02,  1.9416e-02,\n",
       "          3.0617e-03, -1.0273e-02,  6.3175e-02,  1.1511e-01, -5.6148e-02,\n",
       "         -4.0082e-02, -2.4264e-03,  3.4052e-02, -2.9902e-02, -5.0719e-04,\n",
       "          1.2705e-01,  4.5043e-02,  5.9562e-02,  5.4220e-03,  1.6685e-02,\n",
       "          3.9934e-02,  1.5695e-02,  6.5880e-02,  1.2216e-01,  1.6591e-02,\n",
       "          3.0255e-02,  3.8174e-02, -3.3210e-02, -3.9080e-02,  3.8391e-02,\n",
       "         -6.4243e-02, -6.3568e-04, -1.4299e-02, -4.7535e-03, -8.3729e-02,\n",
       "          7.3944e-03,  1.3789e-01, -3.9839e-03, -1.3997e-02, -1.0922e-02,\n",
       "          2.0768e-02,  1.1313e-01,  6.2826e-02,  4.3277e-02,  2.2151e-02,\n",
       "          3.7838e-02,  9.9433e-02, -1.9305e-02, -4.8177e-02, -2.7375e-02,\n",
       "          5.6327e-02, -5.1836e-02, -2.9113e-02,  1.7082e-02,  1.6177e-02,\n",
       "          9.1218e-02, -1.4954e-02, -2.7715e-02,  9.9918e-02,  1.0209e-01,\n",
       "          5.6036e-02,  5.1690e-02,  7.0569e-02,  2.9854e-03,  1.5543e-01,\n",
       "         -2.8874e-02,  7.5500e-02, -3.8931e-02, -1.2140e-02, -9.3100e-03,\n",
       "         -2.3492e-02, -1.6247e-02, -1.5948e-02,  9.2020e-03,  4.1674e-02,\n",
       "         -1.4305e-02,  1.1317e-02,  4.5248e-02,  8.2606e-02,  3.9484e-02,\n",
       "         -9.7340e-02,  4.9336e-02, -1.5238e-03,  1.0416e-01,  2.6806e-03,\n",
       "          1.5314e-01,  4.5263e-02, -6.8892e-03,  1.9196e-02, -5.4623e-02,\n",
       "          3.6792e-02,  8.3394e-02,  3.3292e-02,  1.9765e-02, -5.2593e-02,\n",
       "          6.1291e-02, -5.0305e-02, -5.0697e-03,  4.5954e-02,  6.8161e-02,\n",
       "          9.6058e-02,  2.1877e-02,  6.2865e-02, -4.2575e-02,  5.0053e-02,\n",
       "          4.4037e-02, -6.1568e-02,  1.8372e-02,  4.0565e-02,  8.2517e-03,\n",
       "         -1.3722e-01, -3.5535e-02,  5.1032e-02, -3.9613e-02,  8.4852e-03,\n",
       "          3.3911e-03, -5.2329e-02,  2.7677e-02, -6.4972e-02,  6.8853e-02,\n",
       "          1.6634e-01,  1.0014e-02,  4.5354e-02, -3.8995e-02, -1.0605e-01,\n",
       "         -3.2022e-02, -5.7775e-02, -3.8872e-04,  8.6777e-02,  7.6195e-02,\n",
       "          3.9128e-02,  1.1944e-01,  1.2821e-02, -4.5933e-02, -3.6221e-02,\n",
       "          1.7522e-02,  1.7524e-01,  1.9556e-02,  1.0827e-01,  1.2837e-02,\n",
       "          1.2959e-02, -5.2458e-03,  6.2005e-02,  1.7237e-03, -1.7147e-02,\n",
       "          3.5730e-02, -2.5769e-02, -1.1117e-02,  3.6836e-02,  5.0340e-02,\n",
       "          7.6043e-02,  4.8406e-05,  4.7085e-02, -1.7985e-02,  1.1257e-01,\n",
       "         -3.0835e-02, -2.9757e-03,  8.6469e-03,  2.2267e-02,  7.9733e-02,\n",
       "          1.4783e-02,  8.1315e-02,  1.6117e-01,  9.0520e-02, -4.9884e-02,\n",
       "          1.4587e-02, -3.5895e-03,  7.4778e-02,  1.1368e-01,  1.0734e-01,\n",
       "         -5.5768e-03, -2.1465e-02, -1.4770e-02,  2.1902e-02, -6.9300e-03,\n",
       "          1.0635e-01, -7.7240e-02, -1.7800e-02, -1.9528e-01,  6.5915e-02,\n",
       "          7.3762e-02, -2.0447e-02, -2.0805e-02,  5.8931e-02,  1.2709e-02,\n",
       "         -3.8616e-03,  8.4658e-02, -4.7325e-02, -4.8440e-02,  1.1089e-01,\n",
       "          8.3550e-03,  1.0502e-01,  1.7753e-02,  4.3714e-02,  2.1163e-02,\n",
       "         -6.2188e-03, -1.9630e-03, -2.4239e-02,  6.9710e-02,  3.2040e-02,\n",
       "          7.7345e-02, -3.8260e-04,  4.9131e-02, -2.1674e-02, -3.6689e-02,\n",
       "          6.3862e-02,  1.4898e-01, -2.8171e-02, -1.6041e-02,  8.8913e-02,\n",
       "          6.0569e-02,  7.1894e-03,  3.6295e-02,  6.4377e-02, -1.1996e-01,\n",
       "          1.8688e-01,  4.6338e-02,  5.8470e-02,  6.1145e-02, -6.5616e-03,\n",
       "         -7.8338e-02,  2.7735e-04,  6.6753e-02,  8.1928e-02, -4.5669e-03,\n",
       "          2.9084e-02, -1.3533e-02,  1.4843e-01,  4.0059e-03,  2.4154e-02,\n",
       "          4.5868e-02, -2.0979e-02, -3.2666e-02, -3.4852e-02, -3.7880e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-0.0002,  0.0186, -0.0554,  ...,  0.0566,  0.0036, -0.0541],\n",
       "         [-0.0307,  0.0194, -0.0361,  ..., -0.0545,  0.0063, -0.0183],\n",
       "         [-0.0372,  0.0025,  0.0061,  ..., -0.0410,  0.0003,  0.0297],\n",
       "         ...,\n",
       "         [-0.0628,  0.0506,  0.0524,  ...,  0.0486, -0.0366,  0.0492],\n",
       "         [-0.0193,  0.0734,  0.0621,  ..., -0.0445, -0.0460,  0.0404],\n",
       "         [-0.0207,  0.0038, -0.0323,  ...,  0.0451, -0.0301, -0.0117]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-1.0129e-01, -4.7140e-02, -5.2702e-02,  2.5159e-04,  3.1434e-02,\n",
       "          2.3693e-01,  1.0399e-01, -2.9869e-02, -3.8230e-03, -2.0557e-02,\n",
       "          5.6376e-02,  4.4709e-02, -3.4337e-02,  1.4081e-02,  2.5528e-01,\n",
       "          3.8294e-02, -3.6407e-02,  6.9081e-02,  1.4502e-01, -2.0731e-02,\n",
       "          8.8306e-02, -4.8894e-03,  1.1152e-02,  2.5019e-02, -1.1235e-01,\n",
       "         -7.6175e-02,  7.3867e-02, -2.7945e-03, -1.0894e-01,  1.2728e-01,\n",
       "          7.5061e-02,  1.0520e-01,  6.3043e-02, -1.1204e-01, -5.3663e-03,\n",
       "          5.3621e-02,  9.2972e-02, -3.5841e-02,  2.8665e-02,  2.3549e-01,\n",
       "          2.7396e-02,  2.7037e-02,  5.9955e-02, -2.4569e-02, -1.2433e-02,\n",
       "         -4.5119e-02,  9.1808e-02, -2.2057e-02, -1.1368e-02, -4.7941e-02,\n",
       "          9.7420e-02,  1.6132e-01,  4.1840e-02,  4.3019e-02,  1.5300e-01,\n",
       "          2.0065e-03,  1.4744e-01,  7.7297e-02,  3.5782e-02,  1.2496e-01,\n",
       "         -3.2214e-03,  7.8859e-02,  4.8058e-02,  4.2506e-02,  2.7613e-01,\n",
       "          4.4828e-02,  3.1972e-02,  1.6268e-01,  4.3118e-02, -3.7151e-02,\n",
       "          7.4937e-02, -1.3421e-01,  5.8729e-02, -5.5773e-02, -5.3844e-02,\n",
       "         -5.8798e-02,  5.7848e-03,  1.4982e-01,  4.7126e-02,  5.5985e-03,\n",
       "          2.4734e-02, -1.4338e-01,  9.7034e-02, -4.5245e-02,  1.5200e-01,\n",
       "         -5.2287e-02,  6.1534e-03,  1.9602e-02,  8.6060e-02,  3.6600e-02,\n",
       "          1.0782e-01, -3.6130e-02,  8.1034e-03,  5.1039e-02,  3.8179e-02,\n",
       "         -6.4793e-03, -9.2313e-02,  1.7943e-01,  1.9477e-01, -1.1481e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 1.8385e-02,  3.3778e-02, -3.9031e-02, -1.5353e-02, -1.2282e-01,\n",
       "           2.4703e-01,  4.1169e-01,  2.3174e-02,  1.4312e-01, -2.1053e-03,\n",
       "           2.2730e-03,  9.7855e-02, -4.8044e-02, -7.4414e-02, -9.5054e-02,\n",
       "          -6.0373e-03, -1.0804e-01, -2.1092e-01,  1.9193e-01,  2.0421e-02,\n",
       "          -3.7729e-01,  1.7044e-01,  4.6572e-02,  1.4643e-02, -5.1766e-02,\n",
       "          -1.8289e-01, -1.9345e-01,  8.0269e-02, -3.5140e-01,  2.8413e-02,\n",
       "          -1.4013e-01,  2.2709e-01,  2.4229e-01,  5.7743e-02,  4.6912e-01,\n",
       "          -4.5289e-02,  3.5518e-01, -1.5108e-01,  1.9952e-01, -3.0950e-03,\n",
       "          -3.5240e-02, -2.3567e-01,  1.5344e-01, -7.1811e-02, -5.0596e-02,\n",
       "           4.5544e-02, -1.0137e-01, -1.9020e-01, -4.6748e-02, -3.7471e-02,\n",
       "          -1.9310e-01, -5.0194e-01,  8.0256e-02,  5.2684e-03, -1.8923e-01,\n",
       "           2.2725e-01,  2.5927e-01,  2.6158e-02,  3.1486e-02,  6.5949e-02,\n",
       "          -9.4242e-02,  1.5742e-01, -2.4876e-01, -9.1320e-02, -2.7114e-01,\n",
       "           1.3603e-02,  2.2446e-01,  2.3772e-01, -1.3199e-01,  8.9503e-02,\n",
       "          -2.6666e-01,  1.8192e-01,  2.6515e-01, -7.6906e-02,  1.6027e-03,\n",
       "          -1.0914e-01,  5.3803e-01, -1.5973e-01, -4.9736e-02, -1.0663e-01,\n",
       "          -5.9086e-02,  5.0257e-03, -3.5033e-01,  7.0897e-02, -7.1455e-02,\n",
       "           1.2148e-01, -1.8249e-01,  7.5091e-02,  4.5093e-02,  3.3759e-01,\n",
       "           1.1606e-02, -2.0768e-02, -1.6278e-01,  3.2708e-01, -1.6186e-01,\n",
       "          -1.0195e-01, -6.3314e-02,  2.9030e-01, -1.6462e-01, -2.4668e-02],\n",
       "         [ 3.0950e-02,  7.5907e-02, -2.6345e-02,  3.7594e-02,  8.1816e-03,\n",
       "          -4.3746e-01,  2.3067e-02, -3.1860e-01, -1.7624e-01, -1.0486e-01,\n",
       "          -4.4917e-01, -1.1225e-01,  4.9482e-02, -1.7553e-02, -1.6012e-01,\n",
       "          -7.9340e-02, -5.5853e-01,  1.0951e-01, -1.2452e-01, -8.0587e-02,\n",
       "          -2.8960e-01,  1.8113e-01,  5.2101e-02,  3.8224e-02, -7.8761e-02,\n",
       "          -4.6060e-01,  1.2301e-01, -1.0547e-02,  1.8224e-01, -3.1940e-02,\n",
       "          -1.9696e-01,  1.6818e-01,  3.6708e-01,  1.4897e-01,  1.5494e-01,\n",
       "           4.0315e-01, -1.1256e-01,  5.3263e-01, -1.0240e-01, -3.4040e-01,\n",
       "          -1.5585e-02,  6.3128e-01,  1.9622e-01,  5.6448e-02, -1.3218e-01,\n",
       "          -2.5232e-02,  3.4935e-01, -3.2928e-01,  1.8509e-01, -8.3606e-02,\n",
       "          -1.1966e-02,  7.5933e-02, -8.9332e-02, -2.4747e-01, -4.0701e-02,\n",
       "           2.0885e-01,  1.7048e-01,  1.1737e-02,  6.3438e-02,  5.2503e-02,\n",
       "           5.7031e-02,  1.8224e-02,  7.4895e-02,  2.5053e-01, -2.4150e-01,\n",
       "           3.8793e-01,  6.2766e-02, -3.3571e-01, -1.5286e-01, -3.5007e-03,\n",
       "           2.2494e-01, -2.0155e-02, -3.6103e-01,  1.1486e-02,  8.8844e-02,\n",
       "           1.9519e-03,  1.1242e-01, -5.8038e-02, -2.0268e-01,  2.4398e-02,\n",
       "           8.3374e-02,  1.1759e-01,  3.0313e-01,  3.1854e-01,  5.0369e-02,\n",
       "          -5.9052e-03,  3.2691e-02,  3.6311e-02, -4.9341e-02, -2.8147e-01,\n",
       "          -1.4149e-01, -6.7457e-02,  2.0123e-01,  2.5798e-01,  3.4736e-02,\n",
       "           7.6017e-02,  2.0278e-01, -3.6443e-01, -5.1746e-02, -3.8170e-02],\n",
       "         [-2.8546e-02,  8.6243e-02, -4.7662e-02, -3.7637e-02,  1.3439e-01,\n",
       "          -3.9039e-01,  3.5777e-01,  2.8595e-02,  1.5121e-01,  2.2681e-01,\n",
       "           2.3081e-01, -1.4851e-01, -1.1229e-02,  8.5488e-02, -3.1789e-01,\n",
       "           3.1043e-02,  1.5526e-02,  1.3782e-01, -1.1618e-01, -4.2743e-02,\n",
       "           3.6346e-01, -3.2230e-02, -7.6864e-02,  6.7045e-02,  3.1408e-02,\n",
       "          -2.8032e-01,  1.9012e-01,  2.5192e-02,  4.1627e-02,  3.5353e-02,\n",
       "          -3.0114e-02,  7.8243e-02,  1.0897e-01, -5.9481e-03,  5.6342e-02,\n",
       "           1.9260e-02, -2.4779e-01, -2.8064e-01, -2.2222e-01,  1.4697e-01,\n",
       "           7.9782e-02, -4.2062e-01,  4.1791e-01, -5.2795e-03,  1.4000e-01,\n",
       "          -1.0083e-02, -3.5347e-01,  1.6101e-01,  5.7867e-02, -1.8013e-01,\n",
       "           1.5364e-01, -3.6182e-01, -8.0950e-02,  5.2475e-01,  2.5526e-01,\n",
       "          -2.5714e-01, -2.1471e-01,  1.2312e-01,  8.3557e-02, -1.6912e-02,\n",
       "          -4.6613e-02,  2.4100e-02, -5.0408e-02,  2.4326e-01, -1.6054e-01,\n",
       "           5.8419e-01, -5.9105e-02,  1.2195e-02, -2.1773e-02, -4.1974e-02,\n",
       "          -1.8994e-01, -2.2636e-01,  3.2477e-01, -9.0816e-02, -6.0788e-02,\n",
       "          -5.7345e-02,  8.7079e-02,  1.2435e-01,  2.6442e-01,  6.5309e-02,\n",
       "          -2.4473e-02,  9.2705e-02,  1.4302e-01, -2.2999e-01, -8.8065e-02,\n",
       "          -1.6242e-01, -2.9446e-02,  8.1988e-02, -3.0529e-01, -3.4536e-01,\n",
       "           4.2220e-02,  3.2188e-02, -6.1210e-02,  2.1038e-01,  2.9273e-01,\n",
       "          -3.0104e-01,  5.2626e-02,  1.5996e-01,  1.5602e-03, -9.0041e-02],\n",
       "         [-2.2613e-01, -9.1712e-02, -8.8771e-02,  7.7793e-02,  1.2382e-01,\n",
       "           1.1297e-01, -2.6552e-01, -2.0589e-01,  7.3687e-02,  2.5946e-01,\n",
       "          -3.9592e-01,  1.0777e-02, -7.8817e-02, -1.4719e-04, -2.7329e-01,\n",
       "           8.3548e-02,  3.5158e-02,  6.7207e-02,  1.3433e-01,  3.9381e-02,\n",
       "          -9.3142e-02, -8.2544e-02,  7.9044e-02,  2.5955e-01, -1.1201e-02,\n",
       "           1.0723e-01,  7.0009e-02,  1.4004e-02,  2.0935e-01, -1.1543e-01,\n",
       "           1.9238e-01,  3.8769e-01,  6.4746e-02, -2.4864e-01, -7.1502e-02,\n",
       "           2.7431e-01, -4.0525e-01, -2.5532e-01, -1.0444e-01,  2.1841e-01,\n",
       "           7.7700e-02,  2.5456e-01, -2.0067e-01,  4.5290e-02,  3.2595e-01,\n",
       "          -1.0511e-02,  2.3254e-01,  4.9199e-02, -1.2342e-01,  7.1931e-02,\n",
       "          -1.8556e-01,  5.7801e-01, -3.3122e-02,  4.1278e-02, -6.3630e-02,\n",
       "           2.2742e-01, -1.9306e-01,  4.3834e-02, -5.8711e-02, -1.4972e-01,\n",
       "           6.2189e-03, -3.0786e-02, -1.6928e-02, -3.6924e-02,  1.5620e-01,\n",
       "          -1.2350e-01, -1.8886e-03,  3.5318e-01,  4.9292e-02, -4.1979e-02,\n",
       "           6.0886e-02,  8.8639e-02, -3.1372e-01, -7.4847e-02,  2.2590e-03,\n",
       "           9.0619e-02,  1.2830e-02,  1.1486e-01,  5.6847e-02, -2.3198e-02,\n",
       "           2.7663e-02, -2.2010e-01,  2.6082e-01, -2.6946e-01, -1.6182e-01,\n",
       "          -3.0931e-01, -2.8251e-01,  1.2184e-02, -3.0566e-02,  5.6572e-02,\n",
       "           1.7504e-02,  8.0962e-02, -2.4731e-01,  2.3780e-01, -2.4322e-02,\n",
       "          -4.1319e-02, -4.4296e-02,  2.3568e-01,  1.4293e-01, -3.5607e-02],\n",
       "         [-7.0966e-03, -3.4822e-02, -1.9348e-02,  3.4065e-02,  7.1855e-02,\n",
       "          -1.3146e-01, -2.6192e-01, -2.5712e-02,  5.8311e-01, -1.0192e-01,\n",
       "           1.9467e-01, -2.7456e-01,  9.2987e-02, -1.2307e-02, -4.7249e-01,\n",
       "           1.0645e-02,  1.0325e-01, -2.2960e-01,  3.1782e-02,  6.6579e-03,\n",
       "           1.5310e-01,  7.7098e-02, -4.9155e-02,  2.4929e-01,  6.1255e-02,\n",
       "           3.1018e-01,  1.9471e-01,  8.8073e-02,  3.0347e-01, -4.5363e-02,\n",
       "          -1.0613e-01, -8.3032e-02,  8.0080e-02, -1.5485e-01, -1.6012e-01,\n",
       "           2.2271e-01, -4.9822e-02,  9.1035e-02,  5.3913e-02, -1.0400e-01,\n",
       "           7.9340e-03,  5.4092e-02, -6.2862e-02, -7.1166e-02, -1.6997e-01,\n",
       "           2.2098e-02,  3.6448e-02,  3.5633e-01,  3.8593e-01,  7.3728e-02,\n",
       "          -9.2564e-02,  1.7881e-01, -1.8385e-02,  3.6128e-01, -2.6226e-01,\n",
       "          -2.9514e-01,  7.5452e-02, -1.4034e-01,  5.8751e-02, -2.5297e-01,\n",
       "           1.1059e-02, -2.2887e-01, -3.3144e-01, -2.1526e-01,  1.0197e-01,\n",
       "           2.1080e-01,  2.4379e-01, -2.5857e-01, -1.5586e-01,  3.4608e-02,\n",
       "          -1.5765e-01,  2.5521e-01, -2.7709e-01, -7.9642e-02,  1.3877e-03,\n",
       "          -1.1302e-02, -2.4012e-01,  1.0173e-01, -2.2175e-01, -2.6221e-02,\n",
       "           8.4588e-03,  6.4350e-02,  8.5672e-02,  6.9088e-02, -7.1168e-02,\n",
       "          -1.5173e-02,  1.9331e-01,  1.0822e-02, -2.0114e-01, -2.6155e-01,\n",
       "          -2.6716e-03,  7.7149e-02,  6.4188e-02,  1.1988e-01,  1.8228e-02,\n",
       "          -2.3030e-02,  3.5855e-01, -1.1165e-01, -1.2887e-01,  6.5103e-02],\n",
       "         [-2.3328e-01,  8.4729e-03,  6.0429e-04, -8.0185e-02,  2.0427e-01,\n",
       "           4.1924e-01, -1.6469e-01, -3.1175e-01, -4.6974e-01, -8.6090e-02,\n",
       "           3.9387e-01,  7.5206e-02, -3.7928e-02, -8.0535e-02,  5.8554e-01,\n",
       "          -5.4726e-02, -1.4471e-02, -1.2154e-01,  3.2386e-01,  4.8044e-02,\n",
       "           1.2180e-01, -2.6474e-01,  7.3226e-02, -1.2173e-01, -1.5207e-01,\n",
       "          -2.1501e-01,  9.4392e-03, -9.0891e-02, -5.8677e-01,  2.4866e-01,\n",
       "          -2.2821e-01, -2.3295e-01, -1.4408e-01, -5.3248e-01, -2.4104e-01,\n",
       "          -1.9068e-01, -1.2045e-01,  1.1007e-01,  1.4909e-01,  1.5550e-01,\n",
       "           3.3525e-01, -8.3771e-02,  2.3099e-02, -6.1354e-03, -3.2804e-01,\n",
       "           6.3437e-02, -2.9299e-01, -6.6627e-02, -2.9452e-01,  1.8200e-01,\n",
       "           3.0350e-01, -8.1664e-02, -3.6209e-02, -5.9769e-01, -5.6548e-02,\n",
       "          -2.2172e-02,  1.3202e-01,  4.1668e-01, -4.2072e-02,  6.3397e-01,\n",
       "           7.3565e-03,  1.0750e-01, -7.8047e-02,  1.1226e-01,  3.5416e-01,\n",
       "          -3.2002e-01, -3.0160e-01,  1.4461e-01, -3.9030e-02,  5.8413e-02,\n",
       "          -4.3383e-01, -1.0234e-01, -1.8575e-01, -1.9955e-02,  4.0816e-02,\n",
       "           3.6264e-03, -1.0732e-01,  2.1187e-01, -2.1979e-01, -6.3979e-03,\n",
       "           8.1873e-02, -2.5173e-01,  4.6934e-02, -3.0357e-01,  3.6871e-01,\n",
       "           9.0798e-02,  1.3798e-01, -5.2858e-02,  3.6080e-01,  3.0326e-01,\n",
       "           4.3314e-01, -9.5510e-03,  4.6392e-02, -2.8258e-01,  1.3509e-01,\n",
       "           3.0469e-01, -3.7494e-01,  3.1504e-01,  4.7087e-01, -7.1800e-02],\n",
       "         [ 8.5216e-02,  4.6205e-02, -2.3673e-02, -3.6942e-02,  1.3387e-01,\n",
       "           5.2493e-01,  1.6987e-01,  9.1230e-02,  3.8614e-01, -3.3334e-01,\n",
       "           2.2323e-01,  2.8006e-02, -7.4846e-02, -5.0113e-02,  3.3117e-01,\n",
       "          -8.7522e-02, -1.0541e-01, -1.0356e-02,  4.3975e-01,  5.6065e-02,\n",
       "          -1.4176e-01,  1.9870e-02,  7.5267e-02, -1.0057e-01,  5.6555e-02,\n",
       "          -2.3808e-02, -1.3412e-01,  1.3575e-02,  1.6371e-01, -8.5770e-03,\n",
       "           8.0780e-02,  2.6790e-01,  2.5619e-01, -1.1364e-02,  2.4130e-02,\n",
       "          -2.4990e-01,  6.3085e-01, -1.8481e-01, -2.0463e-01,  5.0052e-01,\n",
       "           5.5920e-02, -3.3068e-01, -5.3723e-01,  8.9804e-02, -2.3120e-01,\n",
       "          -1.9503e-02,  1.3472e-01,  1.1455e-01,  1.7617e-01,  2.9704e-01,\n",
       "          -3.5002e-02, -5.9932e-01,  6.8979e-02,  5.1052e-01, -1.8158e-01,\n",
       "          -1.6284e-02, -3.2097e-01, -1.0184e-01, -1.8279e-02, -4.3325e-01,\n",
       "          -9.2871e-02,  1.5304e-01,  3.2599e-01,  7.7979e-02, -1.9919e-01,\n",
       "          -1.7009e-01,  3.1106e-01,  6.6611e-02,  1.4457e-01,  9.1800e-02,\n",
       "           1.4615e-01, -2.0301e-01, -3.3165e-01, -1.6180e-02, -8.0998e-02,\n",
       "          -6.4777e-02,  1.6434e-01, -3.1078e-01, -2.3740e-02, -7.9489e-02,\n",
       "          -1.2552e-02,  1.3613e-02, -1.3367e-01, -3.8548e-01, -2.2225e-01,\n",
       "          -2.5772e-01, -7.8684e-02,  4.2262e-04,  1.9714e-01,  2.2606e-01,\n",
       "          -2.8163e-01,  9.9718e-02,  1.1818e-01, -2.5980e-01, -9.7129e-03,\n",
       "           1.4191e-01,  1.1111e-01,  3.8323e-02, -1.4697e-01,  7.6906e-02],\n",
       "         [ 2.4962e-01, -5.2975e-03, -8.3521e-02,  2.3297e-02, -1.6378e-01,\n",
       "          -2.0983e-01, -8.7310e-02,  4.0928e-01, -3.2517e-01,  3.5555e-02,\n",
       "          -5.9954e-01,  1.1346e-01,  9.0086e-02,  7.6856e-03,  4.5244e-01,\n",
       "           7.9992e-02,  1.6355e-01,  2.4758e-01, -2.5011e-01,  3.7409e-02,\n",
       "           6.2255e-02, -2.6618e-01, -1.3900e-02, -7.4630e-02, -8.1194e-02,\n",
       "           6.1933e-02,  2.1983e-01,  6.9644e-03,  7.9567e-03,  8.3501e-02,\n",
       "           3.1781e-01, -5.9866e-02, -2.4527e-01,  1.2292e-01, -2.3348e-01,\n",
       "          -3.1831e-03,  7.8462e-02, -1.7743e-01,  1.8554e-01,  1.0639e-01,\n",
       "          -1.8656e-01, -1.3809e-01, -1.4971e-02,  6.2956e-03, -1.1229e-01,\n",
       "          -5.6019e-02,  3.1875e-01, -2.6599e-02, -3.0992e-01, -2.0159e-01,\n",
       "          -2.0536e-01,  3.6234e-01, -5.4731e-02, -2.3458e-01,  4.4761e-01,\n",
       "          -1.4950e-01,  1.3188e-01, -2.1209e-01, -5.1190e-02, -9.4581e-02,\n",
       "          -8.1368e-03, -2.7266e-02,  2.4316e-01, -8.1124e-02,  4.2201e-01,\n",
       "          -2.4105e-01, -2.6906e-01, -2.6703e-01, -5.3549e-02, -7.2206e-02,\n",
       "           3.7828e-01, -8.6673e-02,  2.5011e-01,  1.0455e-02,  4.2762e-02,\n",
       "           8.2052e-03, -4.0502e-01,  1.9753e-01,  3.5533e-01,  3.4139e-02,\n",
       "           1.2771e-01, -2.9333e-01, -3.6052e-02,  2.6159e-01,  9.2385e-02,\n",
       "          -1.1814e-01,  7.6719e-03,  3.3950e-02,  1.7278e-01, -3.5939e-01,\n",
       "          -2.9242e-01,  7.8930e-02,  5.7336e-02, -2.9620e-01, -2.6047e-01,\n",
       "           4.3629e-04, -3.0670e-01, -1.6419e-01,  2.3472e-02,  6.0024e-02],\n",
       "         [-1.2799e-01, -2.7788e-02, -4.1052e-02, -4.9010e-03, -1.0837e-01,\n",
       "           2.7841e-01, -2.8312e-01, -2.0725e-01, -1.2742e-01,  3.4823e-02,\n",
       "           3.7583e-01,  3.1805e-02,  9.4509e-02, -2.0463e-02, -2.6190e-01,\n",
       "          -3.8034e-02,  2.5971e-01,  3.3735e-02,  6.0130e-02, -9.0291e-02,\n",
       "           3.0929e-02,  1.9271e-01,  6.0125e-02, -2.6868e-01, -2.6322e-01,\n",
       "           1.6991e-01,  7.2755e-02, -8.8228e-03,  3.9239e-01, -2.8563e-01,\n",
       "          -7.4343e-03, -4.2526e-01, -4.4439e-01, -5.3307e-02, -9.8715e-02,\n",
       "          -2.7126e-01, -1.4465e-01, -6.8588e-02, -8.1932e-02, -2.8870e-01,\n",
       "           3.3690e-02, -1.1490e-01, -1.2679e-01,  7.9200e-02,  2.5290e-01,\n",
       "           1.0992e-01,  5.3604e-02, -3.8222e-02,  2.9025e-01, -1.8421e-01,\n",
       "          -1.9601e-01,  5.1642e-02, -6.5540e-02, -2.2995e-01,  1.4468e-01,\n",
       "          -2.2804e-01, -1.3077e-01, -2.3712e-01, -2.1505e-02,  1.6351e-02,\n",
       "           1.4927e-02,  2.9062e-01, -2.4259e-02, -1.4473e-01, -1.3349e-01,\n",
       "          -3.1616e-01, -1.6120e-01,  3.0331e-01, -2.1672e-01,  8.9156e-02,\n",
       "           2.4400e-01,  1.9297e-01,  2.6663e-01, -9.2446e-02,  4.0457e-03,\n",
       "          -6.6884e-02,  2.8586e-01,  2.4586e-01,  2.1392e-01, -8.7174e-02,\n",
       "          -1.0319e-01,  3.9338e-01, -5.5489e-02,  5.6914e-01, -2.3840e-01,\n",
       "           3.9447e-01,  1.2055e-01, -5.8288e-02,  1.9068e-01, -6.0910e-02,\n",
       "           8.0538e-02, -6.2901e-02,  2.1985e-01,  5.9121e-02, -1.1230e-01,\n",
       "          -8.4560e-02,  5.3765e-02, -1.3111e-01, -2.8936e-01, -3.9373e-02],\n",
       "         [ 3.3383e-01, -6.8880e-02, -7.6861e-02,  4.0187e-02, -7.9755e-02,\n",
       "          -3.8037e-01, -5.9459e-02,  2.9776e-01, -2.8819e-01, -5.3042e-02,\n",
       "          -6.6159e-02,  2.6997e-01,  8.5296e-02, -6.8378e-02, -8.7763e-02,\n",
       "           8.8425e-02,  3.5099e-01, -4.1078e-02, -4.8736e-01, -5.2537e-02,\n",
       "           8.1514e-02, -1.6571e-01,  1.2747e-02, -8.3926e-02,  5.0023e-01,\n",
       "           2.2288e-01, -2.2430e-01,  1.4425e-02, -6.5746e-02,  5.8492e-02,\n",
       "          -2.1096e-01, -9.7059e-02, -1.6325e-01,  4.8657e-01, -2.1586e-01,\n",
       "          -1.4594e-01,  2.0389e-02,  2.2642e-01,  1.3526e-01, -2.9203e-01,\n",
       "          -1.0514e-01, -8.2065e-02, -7.6475e-02,  6.8352e-02,  1.6569e-01,\n",
       "           3.7838e-02, -1.1592e-01, -2.2346e-01, -4.0094e-01,  9.7535e-04,\n",
       "           1.3356e-01,  2.0159e-01, -2.7533e-02, -2.2931e-01, -1.7175e-01,\n",
       "           3.7765e-01,  8.9141e-02, -2.4058e-02,  1.2977e-02,  1.3722e-01,\n",
       "          -8.0423e-02, -1.9992e-01,  1.0704e-01, -1.3128e-01, -2.6832e-01,\n",
       "          -1.0906e-01, -8.9591e-02, -4.4379e-01,  2.3244e-01, -9.3381e-02,\n",
       "          -2.3057e-01, -4.2213e-02,  3.5892e-01, -6.9800e-02,  8.9853e-02,\n",
       "           4.0746e-02, -4.2516e-01, -1.6004e-01, -6.2757e-02,  8.2358e-02,\n",
       "          -5.8234e-02,  1.1778e-01, -3.1835e-01, -2.1106e-01,  8.3648e-02,\n",
       "           7.9452e-02,  4.0801e-01, -6.1137e-02, -3.2260e-01,  2.0203e-01,\n",
       "          -1.4774e-01, -1.9430e-02, -2.8743e-02, -3.9876e-01,  3.4946e-01,\n",
       "           1.9150e-01,  5.5375e-02, -1.8199e-01, -2.0281e-01,  3.4398e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.1202, -0.2021,  0.0601,  0.0679, -0.3746,  0.5839,  0.0462,  0.1578,\n",
       "         -0.2480, -0.3950], requires_grad=True)]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "OrderedDict([('linear_relu_stack.0.weight',\n",
       "              tensor([[-0.0098, -0.0327, -0.0249,  ...,  0.0129,  0.0318, -0.0025],\n",
       "                      [ 0.0320, -0.0011, -0.0325,  ..., -0.0106, -0.0263, -0.0016],\n",
       "                      [ 0.0112,  0.0132,  0.0124,  ..., -0.0158, -0.0318,  0.0193],\n",
       "                      ...,\n",
       "                      [-0.0029,  0.0002, -0.0133,  ..., -0.0207,  0.0053, -0.0298],\n",
       "                      [-0.0272, -0.0196, -0.0219,  ...,  0.0105, -0.0049,  0.0219],\n",
       "                      [ 0.0199,  0.0160, -0.0129,  ..., -0.0167, -0.0356,  0.0110]])),\n",
       "             ('linear_relu_stack.0.bias',\n",
       "              tensor([-6.1924e-02,  4.7219e-02, -1.2199e-02,  1.9332e-02, -6.9656e-02,\n",
       "                       1.2636e-01, -1.1748e-03,  7.3128e-02,  1.3139e-02, -3.8046e-03,\n",
       "                       7.9963e-02,  4.9807e-02,  1.1632e-01,  4.4749e-02, -4.1856e-02,\n",
       "                       5.2835e-02,  2.7400e-02,  5.5610e-02,  3.6627e-02,  6.0678e-02,\n",
       "                       1.9123e-02,  9.5829e-03,  9.5849e-02,  9.2094e-02, -2.1722e-02,\n",
       "                       3.2610e-03,  1.6744e-02,  1.2911e-01, -8.8393e-03,  3.3600e-02,\n",
       "                       7.7012e-02,  5.5132e-02, -4.4095e-02,  1.9817e-02, -5.3184e-03,\n",
       "                      -1.2636e-02,  1.2599e-01, -6.4185e-02,  1.0129e-01,  8.9009e-03,\n",
       "                       1.6350e-01,  2.6881e-02,  8.8204e-02, -5.9680e-02,  9.9345e-02,\n",
       "                       8.5805e-02,  1.8854e-02, -1.1697e-02, -2.5410e-02,  9.3409e-02,\n",
       "                       7.0586e-02,  3.6597e-02, -2.4283e-03, -1.5532e-02,  2.1564e-02,\n",
       "                      -2.0132e-02, -1.3632e-01,  1.2706e-04,  1.0302e-02,  5.4290e-02,\n",
       "                       1.1809e-01, -1.1090e-01,  6.4115e-02,  1.1897e-01, -3.3895e-02,\n",
       "                      -1.9673e-02,  4.9872e-02,  4.6665e-03,  1.5825e-02,  1.9416e-02,\n",
       "                       3.0617e-03, -1.0273e-02,  6.3175e-02,  1.1511e-01, -5.6148e-02,\n",
       "                      -4.0082e-02, -2.4264e-03,  3.4052e-02, -2.9902e-02, -5.0719e-04,\n",
       "                       1.2705e-01,  4.5043e-02,  5.9562e-02,  5.4220e-03,  1.6685e-02,\n",
       "                       3.9934e-02,  1.5695e-02,  6.5880e-02,  1.2216e-01,  1.6591e-02,\n",
       "                       3.0255e-02,  3.8174e-02, -3.3210e-02, -3.9080e-02,  3.8391e-02,\n",
       "                      -6.4243e-02, -6.3568e-04, -1.4299e-02, -4.7535e-03, -8.3729e-02,\n",
       "                       7.3944e-03,  1.3789e-01, -3.9839e-03, -1.3997e-02, -1.0922e-02,\n",
       "                       2.0768e-02,  1.1313e-01,  6.2826e-02,  4.3277e-02,  2.2151e-02,\n",
       "                       3.7838e-02,  9.9433e-02, -1.9305e-02, -4.8177e-02, -2.7375e-02,\n",
       "                       5.6327e-02, -5.1836e-02, -2.9113e-02,  1.7082e-02,  1.6177e-02,\n",
       "                       9.1218e-02, -1.4954e-02, -2.7715e-02,  9.9918e-02,  1.0209e-01,\n",
       "                       5.6036e-02,  5.1690e-02,  7.0569e-02,  2.9854e-03,  1.5543e-01,\n",
       "                      -2.8874e-02,  7.5500e-02, -3.8931e-02, -1.2140e-02, -9.3100e-03,\n",
       "                      -2.3492e-02, -1.6247e-02, -1.5948e-02,  9.2020e-03,  4.1674e-02,\n",
       "                      -1.4305e-02,  1.1317e-02,  4.5248e-02,  8.2606e-02,  3.9484e-02,\n",
       "                      -9.7340e-02,  4.9336e-02, -1.5238e-03,  1.0416e-01,  2.6806e-03,\n",
       "                       1.5314e-01,  4.5263e-02, -6.8892e-03,  1.9196e-02, -5.4623e-02,\n",
       "                       3.6792e-02,  8.3394e-02,  3.3292e-02,  1.9765e-02, -5.2593e-02,\n",
       "                       6.1291e-02, -5.0305e-02, -5.0697e-03,  4.5954e-02,  6.8161e-02,\n",
       "                       9.6058e-02,  2.1877e-02,  6.2865e-02, -4.2575e-02,  5.0053e-02,\n",
       "                       4.4037e-02, -6.1568e-02,  1.8372e-02,  4.0565e-02,  8.2517e-03,\n",
       "                      -1.3722e-01, -3.5535e-02,  5.1032e-02, -3.9613e-02,  8.4852e-03,\n",
       "                       3.3911e-03, -5.2329e-02,  2.7677e-02, -6.4972e-02,  6.8853e-02,\n",
       "                       1.6634e-01,  1.0014e-02,  4.5354e-02, -3.8995e-02, -1.0605e-01,\n",
       "                      -3.2022e-02, -5.7775e-02, -3.8872e-04,  8.6777e-02,  7.6195e-02,\n",
       "                       3.9128e-02,  1.1944e-01,  1.2821e-02, -4.5933e-02, -3.6221e-02,\n",
       "                       1.7522e-02,  1.7524e-01,  1.9556e-02,  1.0827e-01,  1.2837e-02,\n",
       "                       1.2959e-02, -5.2458e-03,  6.2005e-02,  1.7237e-03, -1.7147e-02,\n",
       "                       3.5730e-02, -2.5769e-02, -1.1117e-02,  3.6836e-02,  5.0340e-02,\n",
       "                       7.6043e-02,  4.8406e-05,  4.7085e-02, -1.7985e-02,  1.1257e-01,\n",
       "                      -3.0835e-02, -2.9757e-03,  8.6469e-03,  2.2267e-02,  7.9733e-02,\n",
       "                       1.4783e-02,  8.1315e-02,  1.6117e-01,  9.0520e-02, -4.9884e-02,\n",
       "                       1.4587e-02, -3.5895e-03,  7.4778e-02,  1.1368e-01,  1.0734e-01,\n",
       "                      -5.5768e-03, -2.1465e-02, -1.4770e-02,  2.1902e-02, -6.9300e-03,\n",
       "                       1.0635e-01, -7.7240e-02, -1.7800e-02, -1.9528e-01,  6.5915e-02,\n",
       "                       7.3762e-02, -2.0447e-02, -2.0805e-02,  5.8931e-02,  1.2709e-02,\n",
       "                      -3.8616e-03,  8.4658e-02, -4.7325e-02, -4.8440e-02,  1.1089e-01,\n",
       "                       8.3550e-03,  1.0502e-01,  1.7753e-02,  4.3714e-02,  2.1163e-02,\n",
       "                      -6.2188e-03, -1.9630e-03, -2.4239e-02,  6.9710e-02,  3.2040e-02,\n",
       "                       7.7345e-02, -3.8260e-04,  4.9131e-02, -2.1674e-02, -3.6689e-02,\n",
       "                       6.3862e-02,  1.4898e-01, -2.8171e-02, -1.6041e-02,  8.8913e-02,\n",
       "                       6.0569e-02,  7.1894e-03,  3.6295e-02,  6.4377e-02, -1.1996e-01,\n",
       "                       1.8688e-01,  4.6338e-02,  5.8470e-02,  6.1145e-02, -6.5616e-03,\n",
       "                      -7.8338e-02,  2.7735e-04,  6.6753e-02,  8.1928e-02, -4.5669e-03,\n",
       "                       2.9084e-02, -1.3533e-02,  1.4843e-01,  4.0059e-03,  2.4154e-02,\n",
       "                       4.5868e-02, -2.0979e-02, -3.2666e-02, -3.4852e-02, -3.7880e-02])),\n",
       "             ('linear_relu_stack.2.weight',\n",
       "              tensor([[-0.0002,  0.0186, -0.0554,  ...,  0.0566,  0.0036, -0.0541],\n",
       "                      [-0.0307,  0.0194, -0.0361,  ..., -0.0545,  0.0063, -0.0183],\n",
       "                      [-0.0372,  0.0025,  0.0061,  ..., -0.0410,  0.0003,  0.0297],\n",
       "                      ...,\n",
       "                      [-0.0628,  0.0506,  0.0524,  ...,  0.0486, -0.0366,  0.0492],\n",
       "                      [-0.0193,  0.0734,  0.0621,  ..., -0.0445, -0.0460,  0.0404],\n",
       "                      [-0.0207,  0.0038, -0.0323,  ...,  0.0451, -0.0301, -0.0117]])),\n",
       "             ('linear_relu_stack.2.bias',\n",
       "              tensor([-1.0129e-01, -4.7140e-02, -5.2702e-02,  2.5159e-04,  3.1434e-02,\n",
       "                       2.3693e-01,  1.0399e-01, -2.9869e-02, -3.8230e-03, -2.0557e-02,\n",
       "                       5.6376e-02,  4.4709e-02, -3.4337e-02,  1.4081e-02,  2.5528e-01,\n",
       "                       3.8294e-02, -3.6407e-02,  6.9081e-02,  1.4502e-01, -2.0731e-02,\n",
       "                       8.8306e-02, -4.8894e-03,  1.1152e-02,  2.5019e-02, -1.1235e-01,\n",
       "                      -7.6175e-02,  7.3867e-02, -2.7945e-03, -1.0894e-01,  1.2728e-01,\n",
       "                       7.5061e-02,  1.0520e-01,  6.3043e-02, -1.1204e-01, -5.3663e-03,\n",
       "                       5.3621e-02,  9.2972e-02, -3.5841e-02,  2.8665e-02,  2.3549e-01,\n",
       "                       2.7396e-02,  2.7037e-02,  5.9955e-02, -2.4569e-02, -1.2433e-02,\n",
       "                      -4.5119e-02,  9.1808e-02, -2.2057e-02, -1.1368e-02, -4.7941e-02,\n",
       "                       9.7420e-02,  1.6132e-01,  4.1840e-02,  4.3019e-02,  1.5300e-01,\n",
       "                       2.0065e-03,  1.4744e-01,  7.7297e-02,  3.5782e-02,  1.2496e-01,\n",
       "                      -3.2214e-03,  7.8859e-02,  4.8058e-02,  4.2506e-02,  2.7613e-01,\n",
       "                       4.4828e-02,  3.1972e-02,  1.6268e-01,  4.3118e-02, -3.7151e-02,\n",
       "                       7.4937e-02, -1.3421e-01,  5.8729e-02, -5.5773e-02, -5.3844e-02,\n",
       "                      -5.8798e-02,  5.7848e-03,  1.4982e-01,  4.7126e-02,  5.5985e-03,\n",
       "                       2.4734e-02, -1.4338e-01,  9.7034e-02, -4.5245e-02,  1.5200e-01,\n",
       "                      -5.2287e-02,  6.1534e-03,  1.9602e-02,  8.6060e-02,  3.6600e-02,\n",
       "                       1.0782e-01, -3.6130e-02,  8.1034e-03,  5.1039e-02,  3.8179e-02,\n",
       "                      -6.4793e-03, -9.2313e-02,  1.7943e-01,  1.9477e-01, -1.1481e-02])),\n",
       "             ('linear_relu_stack.4.weight',\n",
       "              tensor([[ 1.8385e-02,  3.3778e-02, -3.9031e-02, -1.5353e-02, -1.2282e-01,\n",
       "                        2.4703e-01,  4.1169e-01,  2.3174e-02,  1.4312e-01, -2.1053e-03,\n",
       "                        2.2730e-03,  9.7855e-02, -4.8044e-02, -7.4414e-02, -9.5054e-02,\n",
       "                       -6.0373e-03, -1.0804e-01, -2.1092e-01,  1.9193e-01,  2.0421e-02,\n",
       "                       -3.7729e-01,  1.7044e-01,  4.6572e-02,  1.4643e-02, -5.1766e-02,\n",
       "                       -1.8289e-01, -1.9345e-01,  8.0269e-02, -3.5140e-01,  2.8413e-02,\n",
       "                       -1.4013e-01,  2.2709e-01,  2.4229e-01,  5.7743e-02,  4.6912e-01,\n",
       "                       -4.5289e-02,  3.5518e-01, -1.5108e-01,  1.9952e-01, -3.0950e-03,\n",
       "                       -3.5240e-02, -2.3567e-01,  1.5344e-01, -7.1811e-02, -5.0596e-02,\n",
       "                        4.5544e-02, -1.0137e-01, -1.9020e-01, -4.6748e-02, -3.7471e-02,\n",
       "                       -1.9310e-01, -5.0194e-01,  8.0256e-02,  5.2684e-03, -1.8923e-01,\n",
       "                        2.2725e-01,  2.5927e-01,  2.6158e-02,  3.1486e-02,  6.5949e-02,\n",
       "                       -9.4242e-02,  1.5742e-01, -2.4876e-01, -9.1320e-02, -2.7114e-01,\n",
       "                        1.3603e-02,  2.2446e-01,  2.3772e-01, -1.3199e-01,  8.9503e-02,\n",
       "                       -2.6666e-01,  1.8192e-01,  2.6515e-01, -7.6906e-02,  1.6027e-03,\n",
       "                       -1.0914e-01,  5.3803e-01, -1.5973e-01, -4.9736e-02, -1.0663e-01,\n",
       "                       -5.9086e-02,  5.0257e-03, -3.5033e-01,  7.0897e-02, -7.1455e-02,\n",
       "                        1.2148e-01, -1.8249e-01,  7.5091e-02,  4.5093e-02,  3.3759e-01,\n",
       "                        1.1606e-02, -2.0768e-02, -1.6278e-01,  3.2708e-01, -1.6186e-01,\n",
       "                       -1.0195e-01, -6.3314e-02,  2.9030e-01, -1.6462e-01, -2.4668e-02],\n",
       "                      [ 3.0950e-02,  7.5907e-02, -2.6345e-02,  3.7594e-02,  8.1816e-03,\n",
       "                       -4.3746e-01,  2.3067e-02, -3.1860e-01, -1.7624e-01, -1.0486e-01,\n",
       "                       -4.4917e-01, -1.1225e-01,  4.9482e-02, -1.7553e-02, -1.6012e-01,\n",
       "                       -7.9340e-02, -5.5853e-01,  1.0951e-01, -1.2452e-01, -8.0587e-02,\n",
       "                       -2.8960e-01,  1.8113e-01,  5.2101e-02,  3.8224e-02, -7.8761e-02,\n",
       "                       -4.6060e-01,  1.2301e-01, -1.0547e-02,  1.8224e-01, -3.1940e-02,\n",
       "                       -1.9696e-01,  1.6818e-01,  3.6708e-01,  1.4897e-01,  1.5494e-01,\n",
       "                        4.0315e-01, -1.1256e-01,  5.3263e-01, -1.0240e-01, -3.4040e-01,\n",
       "                       -1.5585e-02,  6.3128e-01,  1.9622e-01,  5.6448e-02, -1.3218e-01,\n",
       "                       -2.5232e-02,  3.4935e-01, -3.2928e-01,  1.8509e-01, -8.3606e-02,\n",
       "                       -1.1966e-02,  7.5933e-02, -8.9332e-02, -2.4747e-01, -4.0701e-02,\n",
       "                        2.0885e-01,  1.7048e-01,  1.1737e-02,  6.3438e-02,  5.2503e-02,\n",
       "                        5.7031e-02,  1.8224e-02,  7.4895e-02,  2.5053e-01, -2.4150e-01,\n",
       "                        3.8793e-01,  6.2766e-02, -3.3571e-01, -1.5286e-01, -3.5007e-03,\n",
       "                        2.2494e-01, -2.0155e-02, -3.6103e-01,  1.1486e-02,  8.8844e-02,\n",
       "                        1.9519e-03,  1.1242e-01, -5.8038e-02, -2.0268e-01,  2.4398e-02,\n",
       "                        8.3374e-02,  1.1759e-01,  3.0313e-01,  3.1854e-01,  5.0369e-02,\n",
       "                       -5.9052e-03,  3.2691e-02,  3.6311e-02, -4.9341e-02, -2.8147e-01,\n",
       "                       -1.4149e-01, -6.7457e-02,  2.0123e-01,  2.5798e-01,  3.4736e-02,\n",
       "                        7.6017e-02,  2.0278e-01, -3.6443e-01, -5.1746e-02, -3.8170e-02],\n",
       "                      [-2.8546e-02,  8.6243e-02, -4.7662e-02, -3.7637e-02,  1.3439e-01,\n",
       "                       -3.9039e-01,  3.5777e-01,  2.8595e-02,  1.5121e-01,  2.2681e-01,\n",
       "                        2.3081e-01, -1.4851e-01, -1.1229e-02,  8.5488e-02, -3.1789e-01,\n",
       "                        3.1043e-02,  1.5526e-02,  1.3782e-01, -1.1618e-01, -4.2743e-02,\n",
       "                        3.6346e-01, -3.2230e-02, -7.6864e-02,  6.7045e-02,  3.1408e-02,\n",
       "                       -2.8032e-01,  1.9012e-01,  2.5192e-02,  4.1627e-02,  3.5353e-02,\n",
       "                       -3.0114e-02,  7.8243e-02,  1.0897e-01, -5.9481e-03,  5.6342e-02,\n",
       "                        1.9260e-02, -2.4779e-01, -2.8064e-01, -2.2222e-01,  1.4697e-01,\n",
       "                        7.9782e-02, -4.2062e-01,  4.1791e-01, -5.2795e-03,  1.4000e-01,\n",
       "                       -1.0083e-02, -3.5347e-01,  1.6101e-01,  5.7867e-02, -1.8013e-01,\n",
       "                        1.5364e-01, -3.6182e-01, -8.0950e-02,  5.2475e-01,  2.5526e-01,\n",
       "                       -2.5714e-01, -2.1471e-01,  1.2312e-01,  8.3557e-02, -1.6912e-02,\n",
       "                       -4.6613e-02,  2.4100e-02, -5.0408e-02,  2.4326e-01, -1.6054e-01,\n",
       "                        5.8419e-01, -5.9105e-02,  1.2195e-02, -2.1773e-02, -4.1974e-02,\n",
       "                       -1.8994e-01, -2.2636e-01,  3.2477e-01, -9.0816e-02, -6.0788e-02,\n",
       "                       -5.7345e-02,  8.7079e-02,  1.2435e-01,  2.6442e-01,  6.5309e-02,\n",
       "                       -2.4473e-02,  9.2705e-02,  1.4302e-01, -2.2999e-01, -8.8065e-02,\n",
       "                       -1.6242e-01, -2.9446e-02,  8.1988e-02, -3.0529e-01, -3.4536e-01,\n",
       "                        4.2220e-02,  3.2188e-02, -6.1210e-02,  2.1038e-01,  2.9273e-01,\n",
       "                       -3.0104e-01,  5.2626e-02,  1.5996e-01,  1.5602e-03, -9.0041e-02],\n",
       "                      [-2.2613e-01, -9.1712e-02, -8.8771e-02,  7.7793e-02,  1.2382e-01,\n",
       "                        1.1297e-01, -2.6552e-01, -2.0589e-01,  7.3687e-02,  2.5946e-01,\n",
       "                       -3.9592e-01,  1.0777e-02, -7.8817e-02, -1.4719e-04, -2.7329e-01,\n",
       "                        8.3548e-02,  3.5158e-02,  6.7207e-02,  1.3433e-01,  3.9381e-02,\n",
       "                       -9.3142e-02, -8.2544e-02,  7.9044e-02,  2.5955e-01, -1.1201e-02,\n",
       "                        1.0723e-01,  7.0009e-02,  1.4004e-02,  2.0935e-01, -1.1543e-01,\n",
       "                        1.9238e-01,  3.8769e-01,  6.4746e-02, -2.4864e-01, -7.1502e-02,\n",
       "                        2.7431e-01, -4.0525e-01, -2.5532e-01, -1.0444e-01,  2.1841e-01,\n",
       "                        7.7700e-02,  2.5456e-01, -2.0067e-01,  4.5290e-02,  3.2595e-01,\n",
       "                       -1.0511e-02,  2.3254e-01,  4.9199e-02, -1.2342e-01,  7.1931e-02,\n",
       "                       -1.8556e-01,  5.7801e-01, -3.3122e-02,  4.1278e-02, -6.3630e-02,\n",
       "                        2.2742e-01, -1.9306e-01,  4.3834e-02, -5.8711e-02, -1.4972e-01,\n",
       "                        6.2189e-03, -3.0786e-02, -1.6928e-02, -3.6924e-02,  1.5620e-01,\n",
       "                       -1.2350e-01, -1.8886e-03,  3.5318e-01,  4.9292e-02, -4.1979e-02,\n",
       "                        6.0886e-02,  8.8639e-02, -3.1372e-01, -7.4847e-02,  2.2590e-03,\n",
       "                        9.0619e-02,  1.2830e-02,  1.1486e-01,  5.6847e-02, -2.3198e-02,\n",
       "                        2.7663e-02, -2.2010e-01,  2.6082e-01, -2.6946e-01, -1.6182e-01,\n",
       "                       -3.0931e-01, -2.8251e-01,  1.2184e-02, -3.0566e-02,  5.6572e-02,\n",
       "                        1.7504e-02,  8.0962e-02, -2.4731e-01,  2.3780e-01, -2.4322e-02,\n",
       "                       -4.1319e-02, -4.4296e-02,  2.3568e-01,  1.4293e-01, -3.5607e-02],\n",
       "                      [-7.0966e-03, -3.4822e-02, -1.9348e-02,  3.4065e-02,  7.1855e-02,\n",
       "                       -1.3146e-01, -2.6192e-01, -2.5712e-02,  5.8311e-01, -1.0192e-01,\n",
       "                        1.9467e-01, -2.7456e-01,  9.2987e-02, -1.2307e-02, -4.7249e-01,\n",
       "                        1.0645e-02,  1.0325e-01, -2.2960e-01,  3.1782e-02,  6.6579e-03,\n",
       "                        1.5310e-01,  7.7098e-02, -4.9155e-02,  2.4929e-01,  6.1255e-02,\n",
       "                        3.1018e-01,  1.9471e-01,  8.8073e-02,  3.0347e-01, -4.5363e-02,\n",
       "                       -1.0613e-01, -8.3032e-02,  8.0080e-02, -1.5485e-01, -1.6012e-01,\n",
       "                        2.2271e-01, -4.9822e-02,  9.1035e-02,  5.3913e-02, -1.0400e-01,\n",
       "                        7.9340e-03,  5.4092e-02, -6.2862e-02, -7.1166e-02, -1.6997e-01,\n",
       "                        2.2098e-02,  3.6448e-02,  3.5633e-01,  3.8593e-01,  7.3728e-02,\n",
       "                       -9.2564e-02,  1.7881e-01, -1.8385e-02,  3.6128e-01, -2.6226e-01,\n",
       "                       -2.9514e-01,  7.5452e-02, -1.4034e-01,  5.8751e-02, -2.5297e-01,\n",
       "                        1.1059e-02, -2.2887e-01, -3.3144e-01, -2.1526e-01,  1.0197e-01,\n",
       "                        2.1080e-01,  2.4379e-01, -2.5857e-01, -1.5586e-01,  3.4608e-02,\n",
       "                       -1.5765e-01,  2.5521e-01, -2.7709e-01, -7.9642e-02,  1.3877e-03,\n",
       "                       -1.1302e-02, -2.4012e-01,  1.0173e-01, -2.2175e-01, -2.6221e-02,\n",
       "                        8.4588e-03,  6.4350e-02,  8.5672e-02,  6.9088e-02, -7.1168e-02,\n",
       "                       -1.5173e-02,  1.9331e-01,  1.0822e-02, -2.0114e-01, -2.6155e-01,\n",
       "                       -2.6716e-03,  7.7149e-02,  6.4188e-02,  1.1988e-01,  1.8228e-02,\n",
       "                       -2.3030e-02,  3.5855e-01, -1.1165e-01, -1.2887e-01,  6.5103e-02],\n",
       "                      [-2.3328e-01,  8.4729e-03,  6.0429e-04, -8.0185e-02,  2.0427e-01,\n",
       "                        4.1924e-01, -1.6469e-01, -3.1175e-01, -4.6974e-01, -8.6090e-02,\n",
       "                        3.9387e-01,  7.5206e-02, -3.7928e-02, -8.0535e-02,  5.8554e-01,\n",
       "                       -5.4726e-02, -1.4471e-02, -1.2154e-01,  3.2386e-01,  4.8044e-02,\n",
       "                        1.2180e-01, -2.6474e-01,  7.3226e-02, -1.2173e-01, -1.5207e-01,\n",
       "                       -2.1501e-01,  9.4392e-03, -9.0891e-02, -5.8677e-01,  2.4866e-01,\n",
       "                       -2.2821e-01, -2.3295e-01, -1.4408e-01, -5.3248e-01, -2.4104e-01,\n",
       "                       -1.9068e-01, -1.2045e-01,  1.1007e-01,  1.4909e-01,  1.5550e-01,\n",
       "                        3.3525e-01, -8.3771e-02,  2.3099e-02, -6.1354e-03, -3.2804e-01,\n",
       "                        6.3437e-02, -2.9299e-01, -6.6627e-02, -2.9452e-01,  1.8200e-01,\n",
       "                        3.0350e-01, -8.1664e-02, -3.6209e-02, -5.9769e-01, -5.6548e-02,\n",
       "                       -2.2172e-02,  1.3202e-01,  4.1668e-01, -4.2072e-02,  6.3397e-01,\n",
       "                        7.3565e-03,  1.0750e-01, -7.8047e-02,  1.1226e-01,  3.5416e-01,\n",
       "                       -3.2002e-01, -3.0160e-01,  1.4461e-01, -3.9030e-02,  5.8413e-02,\n",
       "                       -4.3383e-01, -1.0234e-01, -1.8575e-01, -1.9955e-02,  4.0816e-02,\n",
       "                        3.6264e-03, -1.0732e-01,  2.1187e-01, -2.1979e-01, -6.3979e-03,\n",
       "                        8.1873e-02, -2.5173e-01,  4.6934e-02, -3.0357e-01,  3.6871e-01,\n",
       "                        9.0798e-02,  1.3798e-01, -5.2858e-02,  3.6080e-01,  3.0326e-01,\n",
       "                        4.3314e-01, -9.5510e-03,  4.6392e-02, -2.8258e-01,  1.3509e-01,\n",
       "                        3.0469e-01, -3.7494e-01,  3.1504e-01,  4.7087e-01, -7.1800e-02],\n",
       "                      [ 8.5216e-02,  4.6205e-02, -2.3673e-02, -3.6942e-02,  1.3387e-01,\n",
       "                        5.2493e-01,  1.6987e-01,  9.1230e-02,  3.8614e-01, -3.3334e-01,\n",
       "                        2.2323e-01,  2.8006e-02, -7.4846e-02, -5.0113e-02,  3.3117e-01,\n",
       "                       -8.7522e-02, -1.0541e-01, -1.0356e-02,  4.3975e-01,  5.6065e-02,\n",
       "                       -1.4176e-01,  1.9870e-02,  7.5267e-02, -1.0057e-01,  5.6555e-02,\n",
       "                       -2.3808e-02, -1.3412e-01,  1.3575e-02,  1.6371e-01, -8.5770e-03,\n",
       "                        8.0780e-02,  2.6790e-01,  2.5619e-01, -1.1364e-02,  2.4130e-02,\n",
       "                       -2.4990e-01,  6.3085e-01, -1.8481e-01, -2.0463e-01,  5.0052e-01,\n",
       "                        5.5920e-02, -3.3068e-01, -5.3723e-01,  8.9804e-02, -2.3120e-01,\n",
       "                       -1.9503e-02,  1.3472e-01,  1.1455e-01,  1.7617e-01,  2.9704e-01,\n",
       "                       -3.5002e-02, -5.9932e-01,  6.8979e-02,  5.1052e-01, -1.8158e-01,\n",
       "                       -1.6284e-02, -3.2097e-01, -1.0184e-01, -1.8279e-02, -4.3325e-01,\n",
       "                       -9.2871e-02,  1.5304e-01,  3.2599e-01,  7.7979e-02, -1.9919e-01,\n",
       "                       -1.7009e-01,  3.1106e-01,  6.6611e-02,  1.4457e-01,  9.1800e-02,\n",
       "                        1.4615e-01, -2.0301e-01, -3.3165e-01, -1.6180e-02, -8.0998e-02,\n",
       "                       -6.4777e-02,  1.6434e-01, -3.1078e-01, -2.3740e-02, -7.9489e-02,\n",
       "                       -1.2552e-02,  1.3613e-02, -1.3367e-01, -3.8548e-01, -2.2225e-01,\n",
       "                       -2.5772e-01, -7.8684e-02,  4.2262e-04,  1.9714e-01,  2.2606e-01,\n",
       "                       -2.8163e-01,  9.9718e-02,  1.1818e-01, -2.5980e-01, -9.7129e-03,\n",
       "                        1.4191e-01,  1.1111e-01,  3.8323e-02, -1.4697e-01,  7.6906e-02],\n",
       "                      [ 2.4962e-01, -5.2975e-03, -8.3521e-02,  2.3297e-02, -1.6378e-01,\n",
       "                       -2.0983e-01, -8.7310e-02,  4.0928e-01, -3.2517e-01,  3.5555e-02,\n",
       "                       -5.9954e-01,  1.1346e-01,  9.0086e-02,  7.6856e-03,  4.5244e-01,\n",
       "                        7.9992e-02,  1.6355e-01,  2.4758e-01, -2.5011e-01,  3.7409e-02,\n",
       "                        6.2255e-02, -2.6618e-01, -1.3900e-02, -7.4630e-02, -8.1194e-02,\n",
       "                        6.1933e-02,  2.1983e-01,  6.9644e-03,  7.9567e-03,  8.3501e-02,\n",
       "                        3.1781e-01, -5.9866e-02, -2.4527e-01,  1.2292e-01, -2.3348e-01,\n",
       "                       -3.1831e-03,  7.8462e-02, -1.7743e-01,  1.8554e-01,  1.0639e-01,\n",
       "                       -1.8656e-01, -1.3809e-01, -1.4971e-02,  6.2956e-03, -1.1229e-01,\n",
       "                       -5.6019e-02,  3.1875e-01, -2.6599e-02, -3.0992e-01, -2.0159e-01,\n",
       "                       -2.0536e-01,  3.6234e-01, -5.4731e-02, -2.3458e-01,  4.4761e-01,\n",
       "                       -1.4950e-01,  1.3188e-01, -2.1209e-01, -5.1190e-02, -9.4581e-02,\n",
       "                       -8.1368e-03, -2.7266e-02,  2.4316e-01, -8.1124e-02,  4.2201e-01,\n",
       "                       -2.4105e-01, -2.6906e-01, -2.6703e-01, -5.3549e-02, -7.2206e-02,\n",
       "                        3.7828e-01, -8.6673e-02,  2.5011e-01,  1.0455e-02,  4.2762e-02,\n",
       "                        8.2052e-03, -4.0502e-01,  1.9753e-01,  3.5533e-01,  3.4139e-02,\n",
       "                        1.2771e-01, -2.9333e-01, -3.6052e-02,  2.6159e-01,  9.2385e-02,\n",
       "                       -1.1814e-01,  7.6719e-03,  3.3950e-02,  1.7278e-01, -3.5939e-01,\n",
       "                       -2.9242e-01,  7.8930e-02,  5.7336e-02, -2.9620e-01, -2.6047e-01,\n",
       "                        4.3629e-04, -3.0670e-01, -1.6419e-01,  2.3472e-02,  6.0024e-02],\n",
       "                      [-1.2799e-01, -2.7788e-02, -4.1052e-02, -4.9010e-03, -1.0837e-01,\n",
       "                        2.7841e-01, -2.8312e-01, -2.0725e-01, -1.2742e-01,  3.4823e-02,\n",
       "                        3.7583e-01,  3.1805e-02,  9.4509e-02, -2.0463e-02, -2.6190e-01,\n",
       "                       -3.8034e-02,  2.5971e-01,  3.3735e-02,  6.0130e-02, -9.0291e-02,\n",
       "                        3.0929e-02,  1.9271e-01,  6.0125e-02, -2.6868e-01, -2.6322e-01,\n",
       "                        1.6991e-01,  7.2755e-02, -8.8228e-03,  3.9239e-01, -2.8563e-01,\n",
       "                       -7.4343e-03, -4.2526e-01, -4.4439e-01, -5.3307e-02, -9.8715e-02,\n",
       "                       -2.7126e-01, -1.4465e-01, -6.8588e-02, -8.1932e-02, -2.8870e-01,\n",
       "                        3.3690e-02, -1.1490e-01, -1.2679e-01,  7.9200e-02,  2.5290e-01,\n",
       "                        1.0992e-01,  5.3604e-02, -3.8222e-02,  2.9025e-01, -1.8421e-01,\n",
       "                       -1.9601e-01,  5.1642e-02, -6.5540e-02, -2.2995e-01,  1.4468e-01,\n",
       "                       -2.2804e-01, -1.3077e-01, -2.3712e-01, -2.1505e-02,  1.6351e-02,\n",
       "                        1.4927e-02,  2.9062e-01, -2.4259e-02, -1.4473e-01, -1.3349e-01,\n",
       "                       -3.1616e-01, -1.6120e-01,  3.0331e-01, -2.1672e-01,  8.9156e-02,\n",
       "                        2.4400e-01,  1.9297e-01,  2.6663e-01, -9.2446e-02,  4.0457e-03,\n",
       "                       -6.6884e-02,  2.8586e-01,  2.4586e-01,  2.1392e-01, -8.7174e-02,\n",
       "                       -1.0319e-01,  3.9338e-01, -5.5489e-02,  5.6914e-01, -2.3840e-01,\n",
       "                        3.9447e-01,  1.2055e-01, -5.8288e-02,  1.9068e-01, -6.0910e-02,\n",
       "                        8.0538e-02, -6.2901e-02,  2.1985e-01,  5.9121e-02, -1.1230e-01,\n",
       "                       -8.4560e-02,  5.3765e-02, -1.3111e-01, -2.8936e-01, -3.9373e-02],\n",
       "                      [ 3.3383e-01, -6.8880e-02, -7.6861e-02,  4.0187e-02, -7.9755e-02,\n",
       "                       -3.8037e-01, -5.9459e-02,  2.9776e-01, -2.8819e-01, -5.3042e-02,\n",
       "                       -6.6159e-02,  2.6997e-01,  8.5296e-02, -6.8378e-02, -8.7763e-02,\n",
       "                        8.8425e-02,  3.5099e-01, -4.1078e-02, -4.8736e-01, -5.2537e-02,\n",
       "                        8.1514e-02, -1.6571e-01,  1.2747e-02, -8.3926e-02,  5.0023e-01,\n",
       "                        2.2288e-01, -2.2430e-01,  1.4425e-02, -6.5746e-02,  5.8492e-02,\n",
       "                       -2.1096e-01, -9.7059e-02, -1.6325e-01,  4.8657e-01, -2.1586e-01,\n",
       "                       -1.4594e-01,  2.0389e-02,  2.2642e-01,  1.3526e-01, -2.9203e-01,\n",
       "                       -1.0514e-01, -8.2065e-02, -7.6475e-02,  6.8352e-02,  1.6569e-01,\n",
       "                        3.7838e-02, -1.1592e-01, -2.2346e-01, -4.0094e-01,  9.7535e-04,\n",
       "                        1.3356e-01,  2.0159e-01, -2.7533e-02, -2.2931e-01, -1.7175e-01,\n",
       "                        3.7765e-01,  8.9141e-02, -2.4058e-02,  1.2977e-02,  1.3722e-01,\n",
       "                       -8.0423e-02, -1.9992e-01,  1.0704e-01, -1.3128e-01, -2.6832e-01,\n",
       "                       -1.0906e-01, -8.9591e-02, -4.4379e-01,  2.3244e-01, -9.3381e-02,\n",
       "                       -2.3057e-01, -4.2213e-02,  3.5892e-01, -6.9800e-02,  8.9853e-02,\n",
       "                        4.0746e-02, -4.2516e-01, -1.6004e-01, -6.2757e-02,  8.2358e-02,\n",
       "                       -5.8234e-02,  1.1778e-01, -3.1835e-01, -2.1106e-01,  8.3648e-02,\n",
       "                        7.9452e-02,  4.0801e-01, -6.1137e-02, -3.2260e-01,  2.0203e-01,\n",
       "                       -1.4774e-01, -1.9430e-02, -2.8743e-02, -3.9876e-01,  3.4946e-01,\n",
       "                        1.9150e-01,  5.5375e-02, -1.8199e-01, -2.0281e-01,  3.4398e-02]])),\n",
       "             ('linear_relu_stack.4.bias',\n",
       "              tensor([ 0.1202, -0.2021,  0.0601,  0.0679, -0.3746,  0.5839,  0.0462,  0.1578,\n",
       "                      -0.2480, -0.3950]))])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "247254db2f6d4077836ae5a07194b1d7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits.argmax(axis=-1)\n",
    "            \n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())    \n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    \n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):    \n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3777\n",
      "accuracy: 0.8626\n"
     ]
    }
   ],
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
